视图四部曲


1. 混合使用

# views.py

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from .serializer import *


class BookView(APIView):
# 查看所有书籍
    def get(self, request):
        book_list = Book.objects.all()
        bs = BookSerializers(book_list, many=True)
        return Response(bs.data)

# 添加书籍
    def post(self, request):
        bs = BookSerializers(data=request.data)
        if bs.is_valid():  # 验证数据是否有误
            print(bs.validated_data)  # 验证过后正确的数据: OrderedDict([('title', '三国演义'), ('price', 100), ('pub_date', datetime.date(2012, 12, 12)), ('publish', <Publish: 东莞出版社>), ('authors', [<Author: Kevin>, <Author: Aimer>])])
            bs.save()  # 保存数据,实际上调用的是 rest-framework 中的 create 方法
            return Response(bs.data)
        else:
            return Response(bs.errors)  # bs.errors 验证过后的错误信息


class BookDetailView(APIView):
# 查看指定的书籍
    def get(self, request, id):
        book_obj = Book.objects.filter(pk=id).first()
        if book_obj:
            bs = BookSerializers(book_obj)
            return Response(bs.data)
        else:
            return Response({'static': 0, 'message': '没有该书籍'})

# 修改书籍
    def put(self, request, id):
        book_obj = Book.objects.filter(pk=id).first()
        bs = BookSerializers(book_obj, data=request.data)  # 修改数据的时候一定要指定修改那条数据(即: book_obj),否则在执行 .save() 的时候就相当于新增数据
        if bs.is_valid():  # 验证数据是否有误
            bs.save()  # 保存数据,实际上调用的是 rest-framework 中的 update 方法
            return Response(bs.data)
        else:
            return Response(bs.errors)  # bs.errors 验证过后的错误信息

# 删除书籍
    def delete(self, request, id):
        Book.objects.filter(pk=id).delete()
        return Response()


class PublishView(APIView):
# 查看所有出版社
    def get(self, request):
        publish_list = Publish.objects.all()
        ps = PublishSerializers(publish_list, many=True)
        return Response(ps.data)

# 添加出版社
    def post(self, request):
        ps = PublishSerializers(data=request.data)
        if ps.is_valid():  # 验证数据是否有误
            print(ps.validated_data)  # 验证过后正确的数据: OrderedDict([('name', '台山出版社'), ('email', '123@qq.com')])
            ps.save()  # 保存数据,实际上调用的是 rest-framework 中的 create 方法
            return Response(ps.data)
        else:
            return Response(ps.errors)  # ps.errors 验证过后的错误信息


class PublishDetailView(APIView):
# 查看指定的出版社
    def get(self, request, id):
        publish_obj = Publish.objects.filter(pk=id).first()
        if publish_obj:
            ps = PublishSerializers(publish_obj)
            return Response(ps.data)
        else:
            return Response({'static': 0, 'message': '没有该出版社'})

# 修改出版社
    def put(self, request, id):
        publish_obj = Publish.objects.filter(pk=id).first()
        ps = PublishSerializers(publish_obj, data=request.data)  # 修改数据的时候一定要指定修改那条数据(即: publish_obj),否则在执行 .save() 的时候就相当于新增数据
        if ps.is_valid():  # 验证数据是否有误
            ps.save()  # 保存数据,实际上调用的是 rest-framework 中的 update 方法
            return Response(ps.data)
        else:
            return Response(ps.errors)  # ps.errors 验证过后的错误信息

# 删除出版社
    def delete(self, request, id):
        Publish.objects.filter(pk=id).delete()
        return Response()

# serializer.py

from rest_framework import serializers
from .models import *


class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'


class BookSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

# urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'book/$', BookView.as_view()),
    url(r'book/(\d+)', BookDetailView.as_view()),

    url(r'publish/$', PublishView.as_view()),
    url(r'publish/(\d+)', PublishDetailView.as_view()),
]

2.mixin类编写视图

  • 在 mixin 模块下提供了5个类,分别对应着 查询所有数据,查看指定数据,添加数据,修改数据,删除数据,其实这5个类就是将混合使用中的处理http请求的方法封装了起来

  • mixin 模块下的5个类:

    • mixins.ListModelMixin -> 查看所有数据
      • mixins.ListModelMixin 下的 list() 方法: 封装了查看所有数据的代码

    • mixins.CreateModelMixin -> 创建数据
      • mixins.CreateModelMixin 下的create() 方法: 封装了添加数据的代码

    • mixins.RetrieveModelMixin -> 查询指定数据
      • mixins.RetrieveModelMixin 下的 retrieve() 方法: 封装了查询指定数据的代码

    • mixins.UpdateModelMixin -> 修改数据
      • mixins.UpdateModelMixin 下的 update() 方法: PUT请求 -> 封装了修改数据的代码
      • mixins.UpdateModelMixin 下的 partial_update() 方法: PATCH -> 封装了修改数据的代码

    • mixins.DestroyModelMixin -> 删除数据
      • mixins.DestroyModelMixin 下的 destroy() 方法: 封装了删除数据的代码

  • generics 模块下的 GenericAPIView 类,其实就是继承 rest-framework 中的 APIView,并且在这基础上扩展了一些方法

  • 注意:

    • 在使用mixin类编写视图的时候一定要继承 GenericAPIView 类

    • 在使用 mixins.UpdateModelMixin 类的时候,要在操作单条数据的url中加上名为 pk 的命名匹配 -> url(r'book/(?P<pk>\d+)', BookDetailView.as_view())

    • 在使用mixin类编写视图的时候一定要在该视图类下定义两个静态属性,且这两个静态属性的名字不能随便修改一定要使用这两个属性名: 

      • queryset -> 指定操作那张表的数据
      • serializer_class -> 指定序列化类

# views.py

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from .serializer import *

from rest_framework import mixins
from rest_framework import generics


class BookView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):

# 不能随意修改这两个静态属性名,因为 mixins 模块下的 5 个类需要用到这两个静态属性
queryset = Book.objects.all()  # 指定操作那张表的数据
serializer_class = BookSerializers  # 指定序列化类

# 查看所有书籍
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)  # self.list() 是 mixins.ListModelMixin 所提供的方法,封装了查看所有数据的代码,self.list() 的返回值: Response(数据)

# 添加书籍
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)  # self.create() 是 mixins.CreateModelMixin 所提供的方法,封装了添加数据的代码,self.create() 的返回值: Response(数据)


class BookDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):

# 不能随意修改这两个静态属性名,因为 mixins 模块下的 5 个类需要用到这两个静态属性
queryset = Book.objects.all()  # 指定操作那张表的数据
serializer_class = BookSerializers  # 指定序列化类

# 查看指定的书籍
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)  # self.retrieve() 是 mixins.RetrieveModelMixin 所提供的方法,封装了查询指定数据的代码,self.retrieve() 的返回值: Response(数据)

# 修改书籍
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)  # self.update() 是 mixins.UpdateModelMixin 所提供的方法,封装了修改数据的代码,self.update() 的返回值: Response(数据)

# 删除书籍
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)  # self.destroy() 是 mixins.DestroyModelMixin 所提供的方法,封装了删除数据的代码,self.destroy() 的返回值: Response(数据)


class PublishView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):

    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

# 查看所有出版社
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

# 添加出版社
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class PublishDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):

    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

# 查看指定的出版社
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

# 修改出版社
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

# 删除出版社
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

# serializer.py

from rest_framework import serializers
from .models import *


class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'


class BookSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

# urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'book/$', BookView.as_view()),
    url(r'book/(?P<pk>\d+)', BookDetailView.as_view()),

    url(r'publish/$', PublishView.as_view()),
    url(r'publish/(?P<pk>\d+)', PublishDetailView.as_view()),
]

3. 使用通用的基于类的视图

  • 使用通用的基于类的视图说明:

    • 简化了mixin类编写视图的操作

  • generics 模块下的类的功能说明:

    • GenericAPIView 继承了 APIView,且在这基础上扩展了新的功能
    • ----------------------------------------------------
    • generics.ListAPIView  提供了 查询所有数据 的功能
    • generics.CreateAPIView 提供了 添加数据 的功能
    • generics.ListCreateAPIView 提供了 查询所有数据、添加数据 的功能
    • generics.RetrieveAPIView 提供了 查询指定数据 的功能
    • generics.UpdateAPIView 提供了 修改数据 的功能
    • generics.DestroyAPIView 提供了 删除数据 的功能
    • generics.RetrieveUpdateAPIView 提供了 查询指定数据、修改数据 的功能
    • generics.RetrieveDestroyAPIView 提供了 查询指定数据、删除数据 的功能
    • generics.RetrieveUpdateDestroyAPIView 提供了 查询指定数据、修改数据、删除数据 的功能

  • generics.ListAPIView 的说明:
    • 提供了 查询所有数据 的功能
    • ---------------------------------------
    • 继承了 mixins.ListModelMixin
    • 提供了处理 GET 请求的方法
    • 处理GET请求的方法调用了 mixins.ListModelMixin 下的 list() 方法

  • generics.CreateAPIView 的说明:
    • 提供了 添加数据 的功能
    • ---------------------------------------
    • 继承了 mixins.CreateModelMixin
    • 提供了处理 POST 请求的方法
    • 处理POST请求的方法调用了 mixins.CreateModelMixin 下的 create() 方法

  • generics.ListCreateAPIView 的说明:
    • 提供了 查询所有数据、添加数据 的功能
    • ---------------------------------------
    • 继承了 mixins.ListModelMixin / mixins.CreateModelMixin
    • 提供了处理 GET / POST 请求的方法
    • 处理GET请求的方法调用了 mixins.ListModelMixin 下的 list() 方法
    • 处理POST请求的方法调用了 mixins.CreateModelMixin 下的 create() 方法

  • generics.RetrieveAPIView 的说明:
    • 提供了 查询指定数据 的功能
    • ---------------------------------------
    • 继承了 mixins.RetrieveModelMixin
    • 提供了处理 GET 请求的方法
    • 处理GET请求的方法调用了 mixins.RetrieveModelMixin 下的 retrieve() 方法

  • generics.UpdateAPIView 的说明:
    • 提供了 修改数据 的功能
    • ---------------------------------------
    • 继承了 mixins.UpdateModelMixin
    • 提供了处理 PUT / PATCH 请求的方法
    • 处理PUT请求的方法调用了 mixins.UpdateModelMixin 下的 update() 方法
    • 处理PATCH请求的方法调用了 mixins.UpdateModelMixin 下的 partial_update() 方法

  • generics.DestroyAPIView 的说明:
    • 提供了 删除数据 的功能
    • ---------------------------------------
    • 继承了 mixins.DestroyModelMixin
    • 提供了处理 DELETE 请求的方法
    • 处理DELETE请求的方法调用了 mixins.DestroyModelMixin 下的 destroy() 方法

  • generics.RetrieveUpdateAPIView 的说明:
    • 提供了 查询指定数据、修改数据 的功能
    • ---------------------------------------
    • 继承了 mixins.RetrieveModelMixin / mixins.UpdateModelMixin
    • 提供了处理 GET / PUT / PATCH 请求的方法
    • 处理GET请求的方法调用了 mixins.RetrieveModelMixin 下的 retrieve() 方法
    • 处理PUT请求的方法调用了 mixins.UpdateModelMixin 下的 update() 方法
    • 处理PATCH请求的方法调用了 mixins.UpdateModelMixin 下的 partial_update() 方法

  • generics.RetrieveDestroyAPIView 的说明:
    • 提供了 查询指定数据、删除数据 的功能
    • ---------------------------------------
    • 继承了 mixins.RetrieveModelMixin / mixins.DestroyModelMixin
    • 提供了处理 GET / DELETE 请求的方法
    • 处理GET请求的方法调用了 mixins.RetrieveModelMixin 下的 retrieve() 方法
    • 处理DELETE请求的方法调用了 mixins.DestroyModelMixin 下的 destroy() 方法

  • generics.RetrieveUpdateDestroyAPIView 的说明:
    • 提供了 查询指定数据、修改数据、删除数据 的功能
    • ---------------------------------------
    • 继承了 mixins.RetrieveModelMixin / mixins.UpdateModelMixin / mixins.DestroyModelMixin
    • 提供了处理 GET / PUT / PATCH / DELETE 请求的方法
    • 处理GET请求的方法调用了 mixins.RetrieveModelMixin 下的 retrieve() 方法
    • 处理PUT请求的方法调用了 mixins.UpdateModelMixin 下的 update() 方法
    • 处理PATCH请求的方法调用了 mixins.UpdateModelMixin 下的 partial_update() 方法
    • 处理DELETE请求的方法调用了 mixins.DestroyModelMixin 下的 destroy() 方法

  • 注意:
    • 一定要继承 generics 模块所提供的功能类

    • 如果继承了 generics.UpdateAPIView 等涉及到修改数据的功能类,那么就要在操作单条数据的url中加上名为 pk 的命名匹配,因为修改数据的功能类继承了mixins.UpdateModelMixin类,且mixins.UpdateModelMixin类中的代码是通过“pk”这个名字去获取url中的参数,然后才能查询到指定的数据对象 -> url(r'book/(?P<pk>\d+)', BookDetailView.as_view({'请求方式': '视图类的处理请求的方法名'}))

    • 在编写视图的时候一定要在该视图类下定义两个静态属性,且这两个静态属性的名字不能随便修改一定要使用这两个属性名: 

      • queryset -> 指定操作那张表的数据
      • serializer_class -> 指定序列化类

# views.py

from .models import *
from .serializer import *

from rest_framework import generics


class BookView(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers


class BookDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers


class PublishView(generics.ListCreateAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers


class PublishDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

# urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'book/$', BookView.as_view()),
    url(r'book/(?P<pk>\d+)', BookDetailView.as_view()),

    url(r'publish/$', PublishView.as_view()),
    url(r'publish/(?P<pk>\d+)', PublishDetailView.as_view()),
]

4.终极版

  • 终极版的说明:

    • 两条url使用同一个视图类
    • 视图类不再继承mixins模块下的5个类,而是继承 ModelViewSet 类

  • ModelViewSet类的说明:

    • ModelViewSet类已经继承了mixins模块下的5个类

  • .as_view() 新用法的说明:

    • viewsets模块下的ViewSetMixin类通过重写 .as_view() 方法,实现了通过传递的字典({'get':'list', 'post':'create'})方式对处理http请求的方法进行分发

  • 注意:

    • 一定要继承 ModelViewSet 类

    • 要在操作单条数据的url中加上名为 pk 的命名匹配,因为ModelViewSet类继承了mixins.UpdateModelMixin类,且mixins.UpdateModelMixin类中的代码是通过“pk”这个名字去获取url中的参数,然后才能查询到指定的数据对象 -> url(r'book/(?P<pk>\d+)', BookDetailView.as_view({'请求方式': '视图类的处理请求的方法名'}))

    • 在编写视图的时候一定要在该视图类下定义两个静态属性,且这两个静态属性的名字不能随便修改一定要使用这两个属性名: 

      • queryset -> 指定操作那张表的数据
      • serializer_class -> 指定序列化类

# views.py

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from .serializer import *

from rest_framework import viewsets


class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers


class PublishViewSet(viewsets.ModelViewSet):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

# urls.py

# url(r'book/$', BookViewSet.as_view({'请求类型': '视图类的处理请求的方法名'})

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'book/$', BookViewSet.as_view({
        "get": "list",  # list 方法是 mixins.ListModelMixin 所提供的方法,封装了查看所有数据的代码,由于 viewsets.ModelViewSet 继承了 mixins.ListModelMixin 所以可以使用 list 方法
        "post": "create"  # create 方法是 mixins.CreateModelMixin 所提供的方法,封装了添加数据的代码,由于 viewsets.ModelViewSet 继承了 mixins.CreateModelMixin 所以可以使用 create 方法
    })),
    url(r'book/(?P<pk>\d+)', BookViewSet.as_view({
        'get': 'retrieve',  # retrieve 方法是 mixins.RetrieveModelMixin 所提供的方法,封装了查询指定数据的代码,由于 viewsets.ModelViewSet 继承了 mixins.RetrieveModelMixin 所以可以使用 retrieve 方法
        'put': 'update',  # update 方法是 mixins.UpdateModelMixin 所提供的方法,封装了修改数据的代码,由于 viewsets.ModelViewSet 继承了 mixins.UpdateModelMixin 所以可以使用 update 方法
        'patch': 'partial_update',  # partial_update 方法是 mixins.UpdateModelMixin 所提供的方法,封装了修改数据的代码,由于 viewsets.ModelViewSet 继承了 mixins.UpdateModelMixin 所以可以使用 partial_update 方法
        'delete': 'destroy'  # destroy 方法是 mixins.DestroyModelMixin 所提供的方法,封装了删除数据的代码,由于 viewsets.ModelViewSet 继承了 mixins.DestroyModelMixin 所以可以使用 destroy 方法
    })),

    url(r'publish/$', PublishViewSet.as_view({
        "get": "list",
        "post": "create"
    })),
    url(r'publish/(?P<pk>\d+)', PublishViewSet.as_view({
        'get': 'retrieve',
        'put': 'update',
        'patch': 'partial_update',
        'delete': 'destroy'
    })),
]

4.重写 list、create、retrieve、update、partial_update、destroy 方法

  • 如果默认返回给前端的数据结构不合适的话,可以通过重写 list 等方法重新构造数据结构

  • 原理: 在视图类下重写 list 等方法,那么就不会执行 mixin 模块下的5个类所分别提供的方法(即: list、create、retrieve、update、partial_update、destroy

# views.py

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from .serializer import *

from rest_framework import viewsets


class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

# 重写编写 list 方法覆盖 mixins.ListModelMixin 类下的 list 方法
    def list(self, request, *args, **kwargs):
        ret = {
            'static': 1,
            'data': {
                'a': 1,
                'b': 2,
            }
        }
        return Response(ret)

# 重写编写 retrieve 方法覆盖 mixins.RetrieveModelMixin 类下的 retrieve 方法
    def retrieve(self, request, *args, **kwargs):
        ret = {
            'data': '你所查询到的单条数据'
        }
        return Response(ret)


class PublishViewSet(viewsets.ModelViewSet):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

# urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    url(r'book/$', BookViewSet.as_view({
        "get": "list",  # list 方法是 mixins.ListModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.ListModelMixin 所以可以使用 list 方法
        "post": "create"  # create 方法是 mixins.CreateModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.CreateModelMixin 所以可以使用 create 方法
    })),
 url(r'book/(?P<pk>\d+)', BookViewSet.as_view({
        'get': 'retrieve',  # retrieve 方法是 mixins.RetrieveModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.RetrieveModelMixin 所以可以使用 retrieve 方法
        'put': 'update',  # update 方法是 mixins.UpdateModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.UpdateModelMixin 所以可以使用 update 方法
        'patch': 'partial_update',  # partial_update 方法是 mixins.UpdateModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.UpdateModelMixin 所以可以使用 partial_update 方法
        'delete': 'destroy'  # destroy 方法是 mixins.DestroyModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.DestroyModelMixin 所以可以使用 destroy 方法
    })),

url(r'publish/$', PublishViewSet.as_view({
        "get": "list",
        "post": "create"
    })),
url(r'publish/(?P<pk>\d+)', PublishViewSet.as_view({
        'get': 'retrieve',
        'put': 'update',
        'patch': 'partial_update',
        'delete': 'destroy'
    })),
]

.as_view() 的新用法


1..as_view() 新用法的说明

  • .as_view() 新用法的作用就是两条url使用同一个视图类
  • .as_view() 新用法其实就是视图四部曲中的终极版

2..as_view() 新的使用方式一

  • viewsets模块下的ViewSetMixin类通过重写 .as_view() 方法,实现了通过传递的字典({'get':'list', 'post':'create'})方式对处理http请求的方法进行分发

  • 通过继承 ViewSetMixin 类 和 APIView 类 实现 .as_view() 的新用法

# views.py

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework import viewsets


class BookViewSet(viewsets.ViewSetMixin, APIView):

    def list(self, request, *args, **kwargs):
        ret = {
            'data': '你所查询到的所有数据'
        }
        return Response(ret)

    def create(self, request, *args, **kwargs):
        ret = {
            'data': '你所添加的数据'
        }
        return Response(ret)

    def retrieve(self, request, *args, **kwargs):
        ret = {
            'data': '你所查询到的单条数据'
        }
        print(ret)
        return Response(ret)

    def update(self, request, *args, **kwargs):
        ret = {
            'data': '你所修改的数据'
        }
        return Response(ret)

    def partial_update(self, request, *args, **kwargs):
        ret = {
            'data': '你所修改的数据'
        }
        return Response(ret)

    def destroy(self, request, *args, **kwargs):
        ret = {
            'data': '删除数据成功'
        }
        return Response(ret)

# urls.py

urlpatterns = [
    url(r'book/$', BookViewSet.as_view({
        "get": "list",  # list 方法是 mixins.ListModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.ListModelMixin 所以可以使用 list 方法
        "post": "create"  # create 方法是 mixins.CreateModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.CreateModelMixin 所以可以使用 create 方法
    })),
 url(r'book/(?P<pk>\d+)', BookViewSet.as_view({
        'get': 'retrieve',  # retrieve 方法是 mixins.RetrieveModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.RetrieveModelMixin 所以可以使用 retrieve 方法
        'put': 'update',  # update 方法是 mixins.UpdateModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.UpdateModelMixin 所以可以使用 update 方法
        'patch': 'partial_update',  # partial_update 方法是 mixins.UpdateModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.UpdateModelMixin 所以可以使用 partial_update 方法
        'delete': 'destroy'  # destroy 方法是 mixins.DestroyModelMixin 所提供的方法,由于 viewsets.ModelViewSet 继承了 mixins.DestroyModelMixin 所以可以使用 destroy 方法
    })),
]

3..as_view() 新的使用方式二

  • .as_view() 的使用方式二实际上就是视图四部曲中的终极版,通过继承 ModelViewSet 类,实际上 ModelViewSet 类也是继承了 viewsets 模块下的 ViewSetMixin 类

这里就不做代码演示了不懂的可以看回 视图四部曲中的终极版 或者 查看 ModelViewSet 类的源码